/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package gameserver;
import gameserver.api.Output;
import java.util.*;
import gameserver.api.events.*;
import gameserver.api.requests.*;
import gameserver.api.responses.*;
import gameserver.dealers.Dealer;
/**
*
* @author Jorge
*/
public class MessageHandler implements Runnable {
private final Queue<GameEvent> events = new LinkedList<GameEvent>();
public MessageHandler(){
}
public GameResponse handleRequest(GameRequest req, User u){
if(u == null){
Output.error("(not suposed to happen): u == null");
}
PokerServer server = PokerServer.getInstance();
GameResponse resp = null;
if(req instanceof ServerRequest){
resp = server.handleServerRequest((ServerRequest) req, u);
}
else if(req instanceof TableRequest){
TableRequest reqAux = (TableRequest) req;
Table table = server.getTable(reqAux.tablename);
if(table != null){
resp = table.handleTableRequest(reqAux, u);
}
}
if(resp == null){
resp = new GeneralResponse(false);
}
resp.id = req.id;
return resp;
}
private void publishEvent(GameEvent evt){
Output.debug("Publishing Event: "+evt);
try{
PokerServer server = PokerServer.getInstance();
if(evt instanceof ServerEvent){
publish(evt, server.getUsers());
}else if(evt instanceof TableEvent){
TableEvent e = (TableEvent) evt;
Table t = server.getTable(e.tablename);
if(t != null){
Dealer d = t.getDealer();
if(d != null){
d.notifyEvent(evt);
}
publish(evt, t.getUsers());
}
}else if(evt instanceof PlayerEvent){
PlayerEvent e = (PlayerEvent) evt;
Table t = server.getTable(e.tablename);
if(t != null && e.seat >= 0 && e.seat < t.getSeats()){
TablePlayer tp = t.getPlayers()[e.seat];
if(tp != null){
User u = tp.user;
if(u != null)
publish(evt, u);
}
}
}
}catch(Exception e){
Output.warning(e);
}
}
private void publish(GameEvent evt, User u){
if(!u.notify(evt)){
PokerServer.getInstance().logout(u);
}
}
private void publish(GameEvent evt, Collection<User> users){
for(User u: users){
publish(evt, u);
}
}
public void insertEvent(GameEvent evt){
if(evt != null){
synchronized(events){
events.offer(evt);
events.notify();
}
}
}
public MessageHandler init(){
Thread t = new Thread(this);
t.setDaemon(true);
t.start();
return this;
}
public void run(){
while(true){
GameEvent evt;
synchronized(events){
if(events.isEmpty()){
try{ events.wait(); }
catch(InterruptedException ignored){ }
}
if(events.isEmpty()){
// se saiu do wait anterior mas continua sem ter eventos
continue;
}
evt = events.poll();
}
publishEvent(evt);
}
}
}